package com.thinkgsp.jxc.persistence;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.thinkgsp.jxc.model.Customer;

/**
 * 客户供货商持久化接口
 * @author evan
 *
 */
public interface CustomerMapper {

	/**
	 * 根据客户Id获取客户
	 * @param custId 客户Id
	 * @return
	 */
	public Customer getCust(Integer custId);
	
	/**
	 * 根据上级客户获取客户列表,包含上级本身
	 * @param parentId 上级客户Id
	 * @return
	 */
	public List<Customer> getCustByParent(Integer parentId);
	
	/**
	 * 根据职员获取客户列表
	 * @param empId
	 * @return
	 */
	public List<Customer> getCustByEmp(Integer empId);
	
	/**
	 * 根据部门获取客户列表
	 * @param deptId
	 * @return
	 */
	public List<Customer> getCustByDept(Integer deptId);
	
	/**
	 * 根据客户编码获取客户
	 * @param code 客户编码
	 * @return
	 */
	public Customer getCustByCode(String code);
	
	/**
	 * 获取所有客户资料
	 * @param custType 客户类型 : 1 客户 ; 2 供货商 ; 3 客户与供货商
	 * @return
	 */
	public List<Customer> getAllCust(Integer custType);
	
	/**
	 * 获取所有已删除的客户
	 * @return
	 */
	public List<Customer> getDeletedCustomers();
	
	/**
	 * 搜索客户
	 * @param custType 客户类型 : 1 客户 ; 2 供货商 ; 3 客户与供货商
	 * @param val 搜索关键字 搜索范围:编码，名称，监管网编码，名称拼音首字母
	 * @return
	 */
	public List<Customer> searchCust(@Param(value="custType") Integer custType,@Param(value="val") String val);
	
	/**
	 * 新增客户 ,新增客户时信用额度与信用款期均为零
	 * @param cust
	 */
	public void insertCust(Customer cust);
	
	/**
	 * 更新客户资料,本方法不修改客户信用额度与信用天数
	 * @param cust
	 */
	public void updateCust(Customer cust);
	
	/**
	 * 修改客户信用额度;必须有BOSS或管理员权限才能修改信用额度与信用款期
	 * @param custId
	 * @param amount
	 */
	public void updateCustCreditAmount(@Param(value="custId") Integer custId,@Param(value="amount") Integer amount);
	
	/**
	 * 修改客户信用天数;必须有BOSS或管理员权限才能修改信用额度与信用款期
	 * @param custId
	 * @param day
	 */
	public void updateCustCreditDay(@Param(value="custId") Integer custId,@Param(value="creditDay") Integer day);
	
	/**
	 * 账户锁定与解锁
	 * @param custId
	 * @param locked true : 锁定;false 解锁
	 */
	public void custLock(@Param(value="custId") Integer custId,@Param(value="acctLock") Boolean locked);
	
	/**
	 * 账户到期与解除到期。
	 * 当客户欠款额度达到信用额度或欠款天数达到信用天数时称为到期
	 * @param custId
	 * @param expired true : 到期;false 解除
	 */
	public void custExpire(@Param(value="custId") Integer custId,@Param(value="acctExpire") Boolean expired);
	
	/**
	 * 账户启用
	 * @param custId
	 * @param enabled  true : 启用 ; false : 禁用 
	 */
	public void custEnable(@Param(value="custId") Integer custId,@Param(value="acctEnable") Boolean enabled);
	
	/**
	 * 删除客户信息,不实际删除，将deleted设置成true
	 * @param custId
	 */
	public void deleteCust(Integer custId);
	
	/**
	 * 恢复客户信息
	 * @param custId
	 */
	public void restoreCust(Integer custId);
	
	/**
	 * 计算客户当前的欠款金额
	 * @param custId
	 * @return
	 */
	public Integer calcCustCreditAmount(@Param("custId") Integer custId,@Param("fyear") Integer year,@Param("period") Integer period);
	
	/**
	 * 计算客户当前的欠款天数
	 * @param day
	 * @return
	 */
	public Integer calcCustCreditDay(Integer custId);
}
